package com.bdqn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * HelloController
 *
 * @author LILIBO
 * @since 2021-11-01
 */
@Controller // 使用@Controller注解标记该类为SpringMVC的控制器
@RequestMapping("/hello") // 该Controller路径前缀统一为/hello
public class HelloController {

    /**
     * 访问 /hello/hello 路径时调用 hello() 方法
     *
     * @return
     */
    @RequestMapping("/hello")
    public String hello() {
        System.out.println("[GET] hello 我的第一个SpringMVC框架搭建成功！");
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi0 路径时调用 hi0() 方法
     *
     * @return
     */
    @GetMapping("/hi0")
    public String hi0() {
        System.out.println("[GET] hi0 我的第一个SpringMVC框架搭建成功！");
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 使用POST方式访问 /hello/hi1 路径时调用 hi1() 方法
     *
     * @return
     */
    @PostMapping("/hi1")
    public String hi1() {
        System.out.println("[POST] hi1 我的第一个SpringMVC框架搭建成功！");
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi2 路径时调用 hi2() 方法
     *
     * @return
     */
    @GetMapping("/hi2")
    public String hi2(HttpServletRequest request) {
        // 通过request获取请求参数n
        String name = request.getParameter("n");
        System.out.println("[GET] hi2 " + name);
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi2 路径时调用 hi2() 方法
     *
     * @return
     */
    @PostMapping("/hi2")
    public String hi2(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws UnsupportedEncodingException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        // 通过request获取请求参数n
        String name = request.getParameter("n");
        System.out.println("[POST] hi2 " + name);
        session.setAttribute("username", name);
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi3 路径时调用 hi3() 方法
     *
     * @RequestParam String name
     * - @RequestParam 请求参数
     * - String name String类型的name参数
     *
     * @return
     */
    @PostMapping("/hi3")
    public String hi3(@RequestParam String name) {
        // 通过request获取请求参数n
        // String name = request.getParameter("name");
        System.out.println("[POST] hi3 " + name);
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi4 路径时调用 hi4() 方法
     *
     * @RequestParam(value = "n", required = false, defaultValue = "Boy")
     * - @RequestParam 请求参数
     * - value = "n" 参数名称是n
     * - required = false 非必填参数
     * - defaultValue = "Boy" 默认值是Boy
     *
     * @return
     */
    @GetMapping("/hi4")
    public String hi4(@RequestParam(value = "n", required = false, defaultValue = "Boy") String name) {
        // String name = request.getParameter("n");
        System.out.println("[GET] hi4 " + name);
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi5/{n} 路径时调用 hi5() 方法
     *
     * @PathVariable("n")
     * - @PathVariable 路径参数映射
     * - value = "n" 找到路径上{n}映射到形参
     * - required = false 非必填参数
     * - defaultValue = "Boy" 默认值是Boy
     *
     * @return
     */
    @GetMapping("/hi5/{n}")
    public String hi5(@PathVariable("n") String name) {
        System.out.println("[GET] hi5 " + name);
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi6 路径时调用 hi6() 方法
     *
     * @RequestBody String body
     * - @RequestBody 请求的Body内容
     * - String body 以字符串的形式映射到参数body
     *
     * @return
     */
    @PostMapping("/hi6")
    public String hi6(@RequestBody String body) {
        System.out.println("[POST] hi6 " + body);
        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi7 路径时调用 hi7() 方法
     *
     * ModelAndView modelAndView 四大作用域中的page（page、request、session、application）
     *
     * @return
     */
    @GetMapping("/hi7")
    public ModelAndView hi7(@RequestParam String name) {

        ModelAndView modelAndView = new ModelAndView();

        System.out.println("[GET] hi7 " + name);

        // 将name设置到page作用域
        modelAndView.addObject("name", name);

        modelAndView.setViewName("hello");
        // 需要跳转的视图名称
        return modelAndView;
    }

    /**
     * 访问 /hello/hi7 路径时调用 hi7() 方法
     *
     * Model model 四大作用域中的page（page、request、session、application）
     *
     * @return
     */
    @PostMapping("/hi7")
    public String hi7(Model model, @RequestParam String name) {

        System.out.println("[POST] hi7 " + name);

        // 将name设置到page作用域
        model.addAttribute("name", name);

        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi8 路径时调用 hi8() 方法
     *
     * ModelAndView modelAndView 四大作用域中的page（page、request、session、application）
     *
     * @return
     */
    @PostMapping("/hi8")
    public String hi8(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session, @RequestParam String name) throws UnsupportedEncodingException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("[POST] hi8 " + name);

        // 将name设置到page作用域
        model.addAttribute("name", "page-" + name);

        // 将name设置到request作用域
        request.setAttribute("name", "request-" + name);

        // 将name设置到session作用域
        session.setAttribute("name", "session-" + name);

        // 需要跳转的视图名称
        return "hello";
    }

    /**
     * 访问 /hello/hi9 路径时调用 hi7() 方法
     *
     * ModelAndView modelAndView 四大作用域中的page（page、request、session、application）
     *
     * @return
     */
    @GetMapping("/hi9")
    public String hi9(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session, @RequestParam String name) throws IOException {

        System.out.println("[POST] hi9 " + name);

        // 将name设置到page作用域
        model.addAttribute("name", "page-" + name);

        // 将name设置到request作用域
        request.setAttribute("name", "request-" + name);

        // 将name设置到session作用域
        session.setAttribute("name", "session-" + name);

        // 重定向，相当于让浏览器重新发起一个请求
        return "redirect:/hello/hello"; // 重定向redirect:/hello/hello
    }

}
